package com.jy.service.impl;

import com.jy.common.CommonConstant;
import com.jy.mapper.FileMapper;
import com.jy.pojo.FileDetails;
import com.jy.pojo.vo.FileVo;
import com.jy.service.FileService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * 文件业务实现类
 */
@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private FileMapper fileMapper;


    /**
     * 获取文件信息（根据文件夹id）
     * @param fileVo
     * @return
     */
    @Override
    public List<FileDetails> getList(FileVo fileVo) {
        String dirIds = fileVo.getDirIds();
        if (StringUtils.isNotEmpty(dirIds)) {
            dirIds = dirIds.substring(dirIds.lastIndexOf(CommonConstant.DIR_SPLIT) + 1);
            if (StringUtils.isNotEmpty(dirIds)) {
                fileVo.setParentId(Integer.parseInt(dirIds));
            } else {
                fileVo.setParentId(CommonConstant.ROOT_PARENT_ID);
            }
        }
        //wrapper.orderByDesc(FilePojo::getIsDir, FilePojo::getPutTime);
        return fileMapper.getFileList(fileVo);
    }

    /**
     * 获取文件信息（根据文件路径）
     * @param fileVo
     * @return
     */
    public List<FileDetails> getListByPath(FileVo fileVo){
        String dirIds = fileVo.getDirIds();
        if (StringUtils.isNotEmpty(dirIds)) {
            dirIds = dirIds.substring(dirIds.lastIndexOf(CommonConstant.DIR_SPLIT) + 1);
            if (StringUtils.isNotEmpty(dirIds)) {
                FileDetails fileByFileId = fileMapper.getFileByFileId(Integer.parseInt(dirIds));
                if(fileByFileId.getFilePath().equals("\\")){
                    StringBuffer s =new StringBuffer();
                    s.append(fileByFileId.getFileName());
                    fileVo.setDirs(s.toString());
                }else{
                    fileVo.setDirs(fileByFileId.getFilePath());
                }
            } else {
                fileVo.setDirs(CommonConstant.DIR_SPLIT);
            }
        }
        return fileMapper.getFileByFilePath(fileVo.getDirs());
    }

    /**
     * 获取文件夹根本路径（用于展示文件夹下其他文件、文件夹）
     * @param id
     * @return
     */
    public Map<String, Object> getDirs(int id){
        Map<String, Object> map = new HashMap<>();
        //根据当前文件夹编号获取其所有父类编号
        //List<FileDetails> fileDetailsByFileId = fileMapper.selectParentList(id);
        FileDetails fileByFileId = fileMapper.getFileByFileId(id);
        List<FileDetails> fileByFileName=new ArrayList<FileDetails>();
        if(fileByFileId.getFilePath().equals("\\")){
            String [] fileNames={fileByFileId.getFileName()};
            fileByFileName=fileMapper.getFileByFileName(fileNames);
        }else{
            String[] fileNames= new String[200];
            if(StringUtils.isNotEmpty(fileByFileId.getFilePath())) {
                fileNames = fileByFileId.getFilePath().replaceAll("\\\\","/").split(CommonConstant.DIR_SPLIT);
            }
            fileByFileName = fileMapper.getFileByFileName(fileNames);
        }
        //当前路径（字符串）
        StringBuilder dir = new StringBuilder(CommonConstant.DIR_SPLIT);
        //当前路径编号
        StringBuilder dirIds = new StringBuilder(CommonConstant.DIR_SPLIT);
        //如果当前查询出不为空，则拼接文件路径，文件编号路径
//        if (!CollectionUtils.isEmpty(fileDetailsByFileId)) {
//            for (FileDetails filePojo : fileDetailsByFileId) {
//                dir.append(filePojo.getFileName()).append(CommonConstant.DIR_SPLIT);
//                dirIds.append(filePojo.getFileId()).append(CommonConstant.DIR_SPLIT);
//            }
//        }
        if (!CollectionUtils.isEmpty(fileByFileName)) {
            if(fileByFileId.getFilePath().equals("\\")){
                for (FileDetails filePojo : fileByFileName) {
                    dir.append(filePojo.getFileName()).append(CommonConstant.DIR_SPLIT);
                    dirIds.append(filePojo.getFileId()).append(CommonConstant.DIR_SPLIT);
                }
            }else{
                String [] folders=fileByFileId.getFilePath().replaceAll("\\\\","/").split(CommonConstant.DIR_SPLIT);
                for(int i=0;i<folders.length;i++){
                    for (FileDetails filePojo : fileByFileName) {
                        if(filePojo.getFileName().equals(folders[i])){
                            dir.append(filePojo.getFileName()).append(CommonConstant.DIR_SPLIT);
                            dirIds.append(filePojo.getFileId()).append(CommonConstant.DIR_SPLIT);
                            continue;
                        }
                    }
                }
            }
        }
        map.put("dirs", dir.length() > 0 ? dir.deleteCharAt(dir.length() - 1).toString() : "");
        map.put("dirIds", dirIds.length() > 0 ? dirIds.deleteCharAt(dirIds.length() - 1).toString() : "");
        return map;
    }
    /**
     * 获取文件夹根本路径（用于展示文件夹下其他文件、文件夹）
     * @param id
     * @return
     */
    public Map<String, Object> getDirsByPath(int id){
        Map<String, Object> map = new HashMap<>();
        //当前路径（字符串）
        StringBuilder dir = new StringBuilder(CommonConstant.DIR_SPLIT);
        //当前路径编号
        StringBuilder dirIds = new StringBuilder(CommonConstant.DIR_SPLIT);
        //根据当前文件夹编号获取其所有父类编号
        //List<FileDetails> fileDetailsByFileId = fileMapper.selectParentList(id);
        FileDetails fileByFileId = fileMapper.getFileByFileId(id);
        String thisFilePath=fileByFileId.getFilePath().replaceAll("\\\\", CommonConstant.DIR_SPLIT);
        List<FileDetails> fileByFileName=new ArrayList<FileDetails>();
        if(thisFilePath.equals("/")){
            String [] fileNames={fileByFileId.getFileName()};
            fileByFileName=fileMapper.getFileByFileName(fileNames);
        }else{
            StringBuffer stringBuffer =new StringBuffer();
            List<String> searchPaths=new ArrayList<String>();
            String searchPath="";
            for (int i=0;i<thisFilePath.split(CommonConstant.DIR_SPLIT).length-1;i++){
                if(i==0){
                    searchPath=thisFilePath;
                }else{
                    searchPath=searchPath.substring(0,searchPath.lastIndexOf(CommonConstant.DIR_SPLIT));
                }
                searchPaths.add(searchPath.replaceAll(CommonConstant.DIR_SPLIT,"\\\\"));
            }
            //根据文件名称获取文件
            String[] fileName={thisFilePath.substring(0,thisFilePath.indexOf(CommonConstant.DIR_SPLIT))};
            List<FileDetails> fileByFileName1 = fileMapper.getFileByFileName(fileName);
            //根据文件路径获取文件
            fileByFileName = fileMapper.getDirByFilePath(searchPaths);
            fileByFileName.add(fileByFileName1.get(0));
        }
        if (!CollectionUtils.isEmpty(fileByFileName)) {
            if(fileByFileId.getFilePath().equals("\\")){
                for (FileDetails filePojo : fileByFileName) {
                    dir.append(filePojo.getFileName()).append(CommonConstant.DIR_SPLIT);
                    dirIds.append(filePojo.getFileId()).append(CommonConstant.DIR_SPLIT);
                }
            }else{
                String [] folders=fileByFileId.getFilePath().replaceAll("\\\\","/").split(CommonConstant.DIR_SPLIT);
                for(int i=0;i<folders.length;i++){
                    for (FileDetails filePojo : fileByFileName) {
                        if(filePojo.getFileName().equals(folders[i])){
                            dir.append(filePojo.getFileName()).append(CommonConstant.DIR_SPLIT);
                            dirIds.append(filePojo.getFileId()).append(CommonConstant.DIR_SPLIT);
                            continue;
                        }
                    }
                }
            }
        }
        map.put("dirs", dir.length() > 0 ? dir.deleteCharAt(dir.length() - 1).toString() : "");
        map.put("dirIds", dirIds.length() > 0 ? dirIds.deleteCharAt(dirIds.length() - 1).toString() : "");
        return map;
    }

    @Override
    public List<FileDetails> getAllFile() {
        return fileMapper.getAllFile();
    }

    /**
     * 根据文件编号获取文件内容
     * @param fileId
     * @return
     */
    @Override
    public FileDetails getFileByFileId(int fileId) {
        return fileMapper.getFileByFileId(fileId);
    }

    /**
     * 多条件查询文件信息
     * @param fileVo:文件信息查询业务类
     * @return:文件信息List集合
     */
    public List<FileDetails> getFileDetailsBySearch(FileVo fileVo){
        return fileMapper.getFileBySearch(fileVo);
    }

    /**
     * 多条件查询满足条件的数量
     * @param fileVo
     * @return
     */
    @Override
    public int getFileCountBySearch(FileVo fileVo) {
        return fileMapper.getFileCountBySearch(fileVo);
    }
}
